/*
 * @Author: wangze@linkstec.com
 * @Date: 2022-01-17 10:51:08
 * @Function: Please Input Function
 */
// import Vue from 'vue';
import moment from 'moment';
import commonUtil from './commonUtil';

/**
 * 根据某个属性字段获取列表中对应数据的其他属性值
 * @param {*} value 要转换的值
 * @param {*} rest 剩余参数
 */
Vue.filter('TransByList', function (value, ...rest) {
  const first = rest[0] || {};
  const EMPTY = '-';

  if (value === undefined || value === '') return EMPTY;

  // 第一个参数是Object
  if (first.constructor === Object) {
    const [ obj = {}, split = '' ] = rest;
    let split2 = rest[2];
    split2 = split2 || ' ' + split + ' ';
    // 如果有分隔符
    if (split) {
      const keys = value.split(split);
      const items = Object.keys(obj).filter(key => keys.includes(key));
      return items.length ? items.map(key => obj[key]).join(split2) : EMPTY;
    } else {
      return obj[value] || EMPTY;
    }
  }

  // 第一个参数是数组
  if (first.constructor === Array) {
    const [ list, fromKey = 'value', toKey = 'label', split ] = rest;
    if (typeof value === 'undefined' || value === null || value === '' || list.length === 0) {
      return EMPTY;
    }
    let result = [];
    result = (value + '').split(split).map(item => {
      let currentValue = item + '';
      for (let i = 0; i < list.length; i++) {
        if (list[i][fromKey] + '' === item + '') {
          currentValue = list[i][toKey];
          break;
        }
      }
      return currentValue;
    });
    return result.join(' ' + split + ' ');
  }

  return EMPTY;
});

/**
 * 格式化数值 千分化
 * @param {*} fixedNum 保存小数位 默认'auto'，小数位根据实际数值来，最多7位；传数字则保留对应数字位数
 */
export function NumberFormat (value, fixedNum = 'auto') {
  if (typeof value === 'undefined' || value === null || value === '' || isNaN(Number(value))) {
    return '-';
  }
  const string = String(Math.abs(value));
  let result = '';
  const [int, float] = string.split('.');
  const intArr = int.split('');
  const intLen = intArr.length;
  const dotNum = Math.ceil((intLen - 3) / 3);
  for (let i = 0; i < dotNum; i++) {
    const position = intLen - (i + 1) * 3;
    intArr.splice(position, 0, ',');
  }
  result = intArr.join('');
  if (value < 0) { result = '-' + result; };
  if (float !== undefined && float.length) {
    result += '.';
    if (fixedNum === 'auto') {
      result += float;
    } else {
      if (fixedNum > float.length) {
        let suffix = '';
        for (let i = 0; i < fixedNum - float.length; i++) {
          suffix += '0';
        }
        result += float + suffix;
      } else {
        result += float.slice(0, fixedNum);
      }
    }
  }
  return result;
}
Vue.filter('NumberFormat', NumberFormat);

/**
 * 格式化日期
 * @param {*} fromFormat 已知的日期格式
 * @param {*} format 日期格式
 */
Vue.filter('moment', function (dataStr, fromFormat = undefined, format = 'YYYY-MM-DD') {
  if (!dataStr) {
    return '-';
  }

  // 如果是8位数字，默认输入格式为YYYYMMDD
  if (!fromFormat && typeof dataStr === 'number' && String(dataStr).length === 8) {
    fromFormat = 'YYYYMMDD';
  }

  return moment(dataStr, fromFormat).format(format);
});

/**
 * 格式化比例
 * @param {*} fixedNum 需要保留的小数位
 * @param {*} flag 1:百分比  2:千分比  3:万分比
 * @param {*} needNumber 是否需要数值
 * @param {*} needUnit 是否需要单位
 */
Vue.filter('formatRatio', commonUtil.formatRatio);

/**
 * 格式化大数据
 * @param {*} fixedNum 需要保留的小数位
 * @param {*} isInt 是否为整数型
 * @param {*} needNumber 是否需要数值
 * @param {*} needUnit 是否需要单位
 */
Vue.filter('formatBigNumber', commonUtil.formatBigNumber);

/**
 * 字符串切割
 * @param {*} start 切割起点位
 * @param {*} end 切割末位
 */
 Vue.filter('slice', function (value, start, end) {
  if (!value) {
    return '-';
  }
  if (value.length === 0) {
    return '-';
  }
  return value.slice(start, end);
});

/**
 * 时间戳转时间格式
 * type 1 为日期 2为时间
 */
 Vue.filter('TimeDate', function (value, type = 1) {
  if (!value) {
    return '-';
  }
  const now = new Date(value);
  const year = now.getFullYear();
  let month = now.getMonth() + 1;
  let date = now.getDate();
  month = month < 10 ? '0' + month : month;
  date = date < 10 ? '0' + date : date;

  let hour = now.getHours();
  let minute = now.getMinutes();
  let second = now.getSeconds();
  hour = hour < 10 ? '0' + hour : hour;
  minute = minute < 10 ? '0' + minute : minute;
  second = second < 10 ? '0' + second : second;
  if (type === 1) {
    return year + '-' + month + '-' + date;
  } else {
    return year + '-' + month + '-' + date + ' ' + hour + ':' + minute + ':' + second;
  }
});

// 去除文字的<...></...>标签, 以及style, script
Vue.filter('filterHtml', function (val) {
  let result = val.replace(/(<style>.*?<\/style>)/g, '');
  result = result.replace(/<[^>]*>/g, '');
  return result;
});
